import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const Koa = require('koa');
import { config } from './config/env.js';
import { logger } from './utils/logger.js';
import { initRouter } from './utils/route-loader.js';
import { koaBody } from 'koa-body';
// import session from 'koa-session';
import { authMiddleware } from './middleware/auth.js';
import { loggerMiddleware } from './middleware/logger.js';
import { createSwaggerMiddleware } from './middleware/swagger.js';

import { testConnections, getDbPool, dbType } from './config/database.js';
import { watchConfig } from './utils/config-reloader.js';
import { GlobalContext } from './utils/context.js';

// 启用 asyncLocalStorage 功能
const app = new Koa({ asyncLocalStorage: true });
const port = config.app.port;

// 注入数据库连接池
// app.context.mysqlPool = mysqlPool;
// app.context.postgresPool = postgresPool;
app.context.getDbPool = getDbPool;
app.context.dbType = dbType;

// 初始化全局上下文
GlobalContext.init(app);

// logger.info('数据库配置', {
//   type: dbType,
//   isActive: !!getDbPool(),
// });

// 添加访问日志中间件
app.use(loggerMiddleware);

// Swagger文档中间件（在认证中间件之前）
app.use(createSwaggerMiddleware());

//认证中间件;
app.use(authMiddleware);

// 配置 session
// app.keys = [config.app.jwtSecret];
// app.use(session(config.auth.session, app));

// 配置 koa-body
app.use(
  koaBody({
    multipart: true, // 支持文件上传
    formidable: {
      maxFileSize: 200 * 1024 * 1024, // 设置上传文件大小最大限制，默认 200M
      keepExtensions: true, // 保持文件的后缀
      uploadDir: config.app.uploadDir, // 设置文件上传目录
    },
    json: true, // 支持 JSON
    urlencoded: true, // 支持 URL-encoded
    text: true, // 支持 text
    jsonLimit: '10mb', // JSON 请求体大小限制
    formLimit: '10mb', // 表单请求体大小限制
    textLimit: '10mb', // 文本请求体大小限制
  })
);

// 初始化路由
initRouter()
  .then(router => {
    // 注册路由中间件
    app.use(router.routes());
    app.use(router.allowedMethods());

    // 启动配置监听
    watchConfig();

    // 测试数据库连接
    return testConnections();
  })
  .then(() => {
    app.listen(port, () => {
      logger.info('服务器启动成功', {
        port,
        env: config.app.nodeEnv,
        dbType: dbType,
        timestamp: new Date().toISOString(),
      });
    });
  })
  .catch((err: Error) => {
    logger.error('服务器启动失败', {
      error: err.message,
      stack: err.stack,
      timestamp: new Date().toISOString(),
    });
    process.exit(1);
  });
